// 通过self访问全局变量，因为hash.js是在Web Worker中运行的，所以它没有直接访问主线程的全局变量。因此，我们需要使用self来访问全局变量。

//引入sparkmd5.min.js
self.importScripts("/spark-md5.min.js");

// 监听message事件，当主线程发送消息时，执行相应的操作
self.addEventListener("message", async (e) => {
  const { chunks } = e.data;
  const spark = new self.SparkMD5.ArrayBuffer();
  // let spark = new self.SparkMd5.ArrayBuffer(); // 创建spark对象
  /**
   *
   * 获取全部文件内容
   * @param {any} file:Blob
   * @returns
   */
  function getFileContent(file) {
    return new Promise((resolve, reject) => {
      // 使用 FileReader 对象来读取文件，并将其转换为 ArrayBuffer 格式
      const fileReader = new FileReader();
      //读取文件内容
      fileReader.readAsArrayBuffer(file);
      fileReader.onload = (e) => {
        resolve(e.target.result);
      };
      fileReader.onerror = (e) => {
        reject(fileReader.error);
        fileReader.abort();
      };
    });
  }
  //根据文件内容生成hash值
  async function getFileHash(chunks) {
    return new Promise(async (resolve, reject) => {
      let fileContentList = [];
      for (let i = 0; i < chunks.length; i++) {
        let fileContent = await getFileContent(chunks[i].chunk);
        fileContentList.push(fileContent);
      }
      fileContentList.map((item) => {
        spark.append(item);
      });
      let hash = spark.end();
      resolve(hash);
    });
  }
  let fileHash = await getFileHash(chunks);
  self.postMessage({ hash: fileHash }); // 将计算出的文件分片hash值发送给主线程
  self.close();
});
